const fs = require('fs')
const os = require('os')
const puppeteer = require('puppeteer')
const constant = require('../../utils/constant')
const path = require("path")

const platform = os.platform()

exports.svgToPng = async (file) => {
    try {
        await svgToPng(file)

        // 删除临时文件
        /*fs.unlink(file.path, (err) => {
            if (err) console.error('删除临时文件失败:', err);
        });*/
    } catch (e) {
        return e
    }

    return { url: `/${constant.UPLOADS_PATH}/${file.name}.png` }
}

//  通过 puppeteer 打开chrome的页面渲染svg并保存
async function svgToPng(file) {
    let browser = null
    if (platform === 'linux') {
        browser = await puppeteer.launch({
            executablePath: puppeteer.executablePath(),
            args: ['--no-sandbox']
        })
    } else {
        browser = await puppeteer.launch()
    }
    const page = await browser.newPage()
    // 浏览器访问地址 兼容linux & windows
    const svgUrl = `file://${path.join(path.resolve(process.cwd()), constant.CHUNKS_PATH, file.filename)}`
    await page.goto(svgUrl)

    // 设置视口大小
    const svgContent = fs.readFileSync(file.path, 'utf8')
    const svgContentViewBox = extractDimensionsFromViewBox(svgContent.slice(0, 200))
    if (svgContentViewBox.width) {
        const deviceScaleFactor = 3 // 设备像素比
        await page.setViewport({
            width: parseInt(svgContentViewBox.width),
            height: parseInt(svgContentViewBox.height),
            deviceScaleFactor,
            // isMobile: true
        })
    }

    // 截图保存为 PNG
    await page.screenshot({
        fullPage: true, // 截取完整页面
        omitBackground: true, // 透明背景
        path: `${constant.UPLOADS_PATH}/${file.name}.png`,   //  保存地址
        type: 'png'
    });

    await browser.close()
}

//  提取svg的viewBox中的width和height
function extractDimensionsFromViewBox(svgString) {
    // 使用正则表达式匹配 viewBox 的值
    const viewBoxMatch = svgString.match(/viewBox="([^"]*)"/)

    if (!viewBoxMatch) {
        return { width: null, height: null }
    }

    // 提取 viewBox 的数字部分，并按空格分割成数组
    const viewBoxValues = viewBoxMatch[1].split(' ')

    // 确保至少有4个值（x y width height）
    if (viewBoxValues.length < 4) {
        return { width: null, height: null }
    }

    return {
        x: viewBoxValues[0],
        y: viewBoxValues[1],
        width: viewBoxValues[2],
        height: viewBoxValues[3],
    }
}
